package common

import "encoding/json"

type ServerConfig struct {
	HttpServer   *string    `json:"http_server" yaml:"http_server"`
	TcpServer    *string    `json:"tcp_server" yaml:"tcp_server"`
	LogConfig    *LogConfig `json:"log" yaml:"log"`
	UpanSkipWord *string    `json:"upan_skip_word" yaml:"upan_skip_word"`
}

// 日志子配置
type LogConfig struct {
	MaxFileNum   *int    `json:"max_file_num" yaml:"max_file_num"`
	FileName     *string `json:"file_name" yaml:"file_name"`
	MaxFileSize  *int    `json:"max_file_size" json:"max_file_size"` // MB
	MaxFileAge   *int    `json:"max_file_age" json:"max_file_age"`   // 天
	FileCompress *bool   `json:"file_compress" json:"file_compress"`
	Level        *string `json:"level" json:"level"`
	OutType      *string `json:"out_type" json:"out_type"`
}

func (config *ServerConfig) GetHttpServerAddr() string {
	if config.HttpServer == nil {
		return ""
	}

	return *config.HttpServer
}

func (config *ServerConfig) GetTcpserverAddr() string {
	if config.TcpServer == nil {
		return ""
	}

	return *config.TcpServer
}

func (config *ServerConfig) GetUpanSkipWord() string {
	if config.UpanSkipWord == nil {
		return ""
	}

	return *config.UpanSkipWord
}

func (config *ServerConfig) GetLogMaxFileNum() int {
	if config == nil || config.LogConfig == nil {
		return 3
	}

	return *config.LogConfig.MaxFileNum
}

func (config *ServerConfig) GetLogFileName() string {
	if config == nil || config.LogConfig == nil {
		return "usbipserver.log"
	}

	return *config.LogConfig.FileName
}

func (config *ServerConfig) GetLogMaxFileSize() int {
	if config == nil || config.LogConfig == nil {
		return 1024
	}

	return *config.LogConfig.MaxFileSize
}

func (config *ServerConfig) GetLogMaxFileAge() int {
	if config == nil || config.LogConfig == nil {
		return 7
	}

	return *config.LogConfig.MaxFileAge
}

func (config *ServerConfig) GetLogFileCompress() bool {
	if config == nil || config.LogConfig == nil {
		return false
	}

	return *config.LogConfig.FileCompress
}

func (config *ServerConfig) GetLogLevel() string {
	if config == nil || config.LogConfig == nil {
		return "info"
	}

	return *config.LogConfig.Level
}

func (config *ServerConfig) GetLogOutType() string {
	if config == nil || config.LogConfig == nil {
		return "console"
	}

	return *config.LogConfig.OutType
}

func (config *ServerConfig) Merge(tmp *ServerConfig) {
	if tmp == nil {
		return
	}

	if tmp.HttpServer != nil {
		config.HttpServer = tmp.HttpServer
	}
	if tmp.TcpServer != nil {
		config.TcpServer = tmp.TcpServer
	}
	if tmp.UpanSkipWord != nil {
		config.UpanSkipWord = tmp.UpanSkipWord
	}
	if tmp.LogConfig != nil {
		if tmp.LogConfig.MaxFileNum != nil {
			config.LogConfig.MaxFileNum = tmp.LogConfig.MaxFileNum
		}
		if tmp.LogConfig.FileName != nil {
			config.LogConfig.FileName = tmp.LogConfig.FileName
		}
		if tmp.LogConfig.MaxFileSize != nil {
			config.LogConfig.MaxFileSize = tmp.LogConfig.MaxFileSize
		}
		if tmp.LogConfig.MaxFileAge != nil {
			config.LogConfig.MaxFileAge = tmp.LogConfig.MaxFileAge
		}
		if tmp.LogConfig.FileCompress != nil {
			config.LogConfig.FileCompress = tmp.LogConfig.FileCompress
		}
		if tmp.LogConfig.Level != nil {
			config.LogConfig.Level = tmp.LogConfig.Level
		}
		if tmp.LogConfig.OutType != nil {
			config.LogConfig.OutType = tmp.LogConfig.OutType
		}
	}
}

func (config *ServerConfig) String() string {
	configByte, _ := json.Marshal(config)
	return string(configByte)
}
